﻿using System;
using System.Collections.Generic;
using System.Linq;
using MIAP.DataAccess.Interfaces;
using MIAP.Entidades;

namespace MIAP.Negocio
{
    /// <summary>
    /// Clase para las operaciones de negocio de la vista Consulta Ejecución Proyecto.
    /// </summary>
    public class ConsultaEjecucionProyectoNegocio
    {
        /// <summary>
        /// Instancia para el acceso a las operaciones de BD del dao ConsultaEjecucionProyecto.
        /// </summary>
        private readonly IConsultaEjecucionProyectoDao daoConsultaEjecucionProyecto;

        /// <summary>
        /// Icicializa una instancia de <see cref="ConsultaEjecucionProyectoNegocio"/>
        /// </summary>
        public ConsultaEjecucionProyectoNegocio()
        {
            daoConsultaEjecucionProyecto = DataAccessFactory.Instance.CreateConsultaEjecucionProyectoDao();
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="consultaEjecucion"></param>
        /// <returns></returns>
        public List<ConsultaEjecucionProyectoInfo> GetEjecucionProyectosByPeriodo(ConsultaEjecucionProyectoInfo consultaEjecucion)
        {
            var retorno = this.daoConsultaEjecucionProyecto.GetEjecucionProyectosByPeriodo(consultaEjecucion).ToList();
            foreach (var consultaEjecucionProyectoInfo in retorno.Where(consultaEjecucionProyectoInfo => consultaEjecucionProyectoInfo.Estatus == "No ejecutado"))
            {
                consultaEjecucionProyectoInfo.FinEjecución = consultaEjecucionProyectoInfo.InicioEjecucion = (DateTime?)null;
                consultaEjecucionProyectoInfo.Ejecutante = string.Empty;
            }
            var listaProyectos = DataAccessFactory.Instance.CreateProyectosDao().GetProyectos(null, true);
            foreach (var proyecto in listaProyectos.Where(proyecto => retorno.All(elemento => elemento.IdProyecto != proyecto.IDProyecto)))
            {
                retorno.Add(new ConsultaEjecucionProyectoInfo
                    {
                        IdProyecto = proyecto.IDProyecto,
                        NombreProyecto = proyecto.NombreProyecto,
                        Año = consultaEjecucion.Año,
                        Mes = consultaEjecucion.Mes,
                        Estatus = "No ejecutado",
                        IdEstatus = 0,
                        IdPeriodoInformacion = proyecto.PeriodoInformacion.IdentificadorPeriodo,
                        PeriodoCarga = proyecto.PeriodoCarga.NombrePeriodo,
                        PeriodoInformacion = proyecto.PeriodoInformacion.NombrePeriodo
                    });
            }

            //obtenemos la lista sin objetos repetidos
            var lista = new List<ConsultaEjecucionProyectoInfo>();
            foreach (var ejecucionProyectoInfo in retorno.Where(ejecucionProyectoInfo => !lista.Any(elemento => elemento.Equals(ejecucionProyectoInfo))))
            {
                lista.Add(ejecucionProyectoInfo);
            }
            return lista;
        }
    }
}
